package DoblePointer;//给你一个按 非递减顺序 排序的整数数组 nums，返回 每个数字的平方 组成的新数组，要求也按 非递减顺序 排序。
//
// 
// 
//
// 
//
// 示例 1： 
//
// 
//输入：nums = [-4,-1,0,3,10]
//输出：[0,1,9,16,100]
//解释：平方后，数组变为 [16,1,0,9,100]
//排序后，数组变为 [0,1,9,16,100] 
//
// 示例 2： 
//
// 
//输入：nums = [-7,-3,2,3,11]
//输出：[4,9,9,49,121]
// 
//
// 
//
// 提示： 
//
// 
// 1 <= nums.length <= 10⁴ 
// -10⁴ <= nums[i] <= 10⁴ 
// nums 已按 非递减顺序 排序 
// 
//
// 
//
// 进阶： 
//
// 
// 请你设计时间复杂度为 O(n) 的算法解决本问题 
// 
// Related Topics 数组 双指针 排序 👍 327 👎 0


import java.util.Arrays;

//leetcode submit region begin(Prohibit modification and deletion)
class sortedSquares {
    public int[] sortedSquares1(int[] nums) {
        // 1 先平方再排序
        for (int i = 0; i < nums.length; i++) {
            nums[i] *= nums[i];
        }
        Arrays.sort(nums);
        return nums;

    }

    public int[] sortedSquares(int[] nums) {
        /**
         * 2.三指针法 左i右j指针，和保存的位置指针k
         * 首尾指针比较平方后的值，较大的放到末尾，一次移动两个指针,确保不漏情况
         * */
        int n = nums.length;
        int[] res = new int[n];
        int i = 0, j = n-1, k = n-1;
        while (i<=j){
            if (nums[i]*nums[i] < nums[j]*nums[j]){

                res[k--] = nums[j]*nums[j];
                j--;
            }else{
                res[k--] = nums[i]*nums[i];
                i++;
            }
        }
        return res;

    }
}
//leetcode submit region end(Prohibit modification and deletion)
